package tp.model;

import java.awt.Component;
import java.util.Observable;

import tp.controller.Controlador;

import java.util.*;

public class Nucleo extends Observable implements Chocable {

	protected double MiAncho = 20;

	protected double MiAlto = 10;

	protected ColChocables ListaChocables;

	/* cantidad de golpes a ser destruido */
	protected int Vida = 1;

	/* puntos que otorgan al ser destruidos */
	private int Puntaje;

	/* Posicion */
	private Posicion MiPosicion;

	protected Nave miNave;
	
	private boolean vivo;

	/* Direccion */
	private Posicion MiDireccion = new Posicion(0, -1);

	public Nucleo(Posicion pos) {
		this.MiPosicion = pos;
		this.setVivo(true);
	}

	/*
	 * Calcula la posicion exacta de donde lo chocaron, tomando como datos la
	 * posicion deonde estaba el objeto chocador y la direccion que tenia @param
	 * Chocable Recibe el elemento que produce el choque @return Posicion Que es
	 * la posicion en donde el choque fue producido (sobre alguno de los cuatro
	 * lados del bloque)
	 */
	public Posicion dondeMeToca(Chocable elem) {
		return null;
	}

	private double MiRadio = 1;

	/*
	 * (non-Javadoc)
	 * 
	 * @see tp.Chocable#miNormal()
	 */
	public Posicion miNormal(Posicion pos1, Posicion dir1) {
		return new Posicion(0, -1);
	}

	/*
	 * Constructor: Recibe la cantidad de vida y puntaje que otorga con la
	 * posicion recibida
	 */
	/*
	 * public Ladrillo(int VidaSet, int PuntajeSet, Posicion Pos){
	 * this.setVida(VidaSet); this.setPuntaje(PuntajeSet); this.MiPosicion=Pos; };
	 */

	protected int getVida() {
		return this.Vida;
	};

	protected void setVida(int vidaSet) {
		this.Vida = vidaSet;
	};

	protected int getPuntaje() {
		return this.Puntaje;
	};

	protected void setPuntaje(int puntajeSet) {
		this.Puntaje = puntajeSet;
	};

	/*
	 * Responde al choque, se quita una posibilidad de vida y se fija si fue
	 * destruido
	 */
	public void meChocaron(Chocable elem) {
		this.setVida((this.getVida() - 1));
		if (this.getVida() == 0) {
			this.meDestruyo();
		}
	};

	/**
	 * Devuelve los puntos que otorga por ser destruido y/o el especial de cada
	 * ladrillo en caso de que tenga la llamada debera estar aqui
	 */
	public void meDestruyo() {
		// mostraria que hace explosion o algo similar
		// tendria que avisarle al controlador que se fue al joraca
		Controlador.setPuntaje(this.getPuntaje());
		// llamaria a especial de necesitarlo
	}

	/**
	 * @return miPosicion. en una vble Posicion
	 */
	public Posicion getMiPosicion() {
		return this.MiPosicion;
	}

	/**
	 * @param miPosicion
	 *            que es para setear miPosicion
	 */
	public void setMiPosicion(Posicion miPosicion) {
		this.MiPosicion = miPosicion;
	};

	/**
	 * no tiene direccion el ladrillo
	 * 
	 * @return null
	 */
	public Posicion getMiDireccion() {
		return this.MiDireccion;
	}

	/**
	 * Por ahora no hace nada los ladrillos no se mueven
	 * 
	 * @return devuelve la posicion cualquiera
	 */
	public Posicion getMiPosicionVieja() {
		return this.getMiPosicion();
	};

	/**
	 * 
	 */
	public boolean meToca(Chocable elem) {
		return false;
	}

	public boolean meToca(Posicion pos) {
		if ((pos.getX() > (this.MiPosicion.getX() - this.MiAncho / 2) && (pos
				.getX() < (this.MiPosicion.getX()) + this.MiAncho / 2))) {
			if ((pos.getY() > (this.MiPosicion.getY() - this.MiAlto / 2) && (pos
					.getY() < (this.MiPosicion.getY()) + this.MiAlto / 2))) {
				return true;
			}
		}
		return false;
	}

	/**
	 * @return the miAlto
	 */
	public double getMiAlto() {
		return MiAlto;
	}

	/**
	 * @param miAlto
	 *            the miAlto to set
	 */
	public void setMiAlto(double miAlto) {
		MiAlto = miAlto;
	}

	/**
	 * @return the miAncho
	 */
	public double getMiAncho() {
		return MiAncho;
	}

	/**
	 * @param miAncho
	 *            the miAncho to set
	 */
	public void setMiAncho(double miAncho) {
		MiAncho = miAncho;
	}

	public Posicion hago() {
		// return MiDireccion;
		// aca se va a mover;
		// le pide al controlador la nave
		// y se fija si lo choca sino, sigue cayendo

		this.setMiPosicion(this.MiPosicion.sumarPosicion(this.getMiDireccion()
				.multiplicarPosicion(6)));
		Iterator it = Controlador.controlador.ListaChocables.iterator();
		boolean choque = false;
		while ((it.hasNext()) && (!choque)) {
			Chocable elemChoc = (Chocable) it.next();
			if ((elemChoc.getClase() == "Nave")) {
				if (elemChoc.meToca(this)) {
					// con esto le vamos a decir a la nave que se ponga el
					// especial
					// y lo ejecute
					miNave = (Nave) elemChoc;
					choque = true;
					this.meDestruyo();
				}
			}
			if (elemChoc.getClase() == "Borde") {
				if (elemChoc.meToca(this)) {
					choque = true;
					this.meDestruyo();
				}
			}
		}
		// me parece que ya esta arreglado... hay que probarlo
		return getMiPosicion();
		// .sumarPosicion(this.getMiDireccion().invertir().multiplicarPosicion(this.getMiRadio()))
	}

	public Posicion miNormal(Chocable elem) {
		// TODO Auto-generated method stub
		return null;
	}

	public String getClase() {
		return "Nucleo";
	}

	public boolean isVivo() {
		// TODO cambiar cuando se pase del fondo o cuando lo agarre la nave
		return (this.getVida() != 0);
	}

	/**
	 * @param listChocables
	 *            the listChocables to set
	 */
	public void setListaChocables(ColChocables listChocables) {
		ListaChocables = listChocables;
	}

	/**
	 * @return the miRadio
	 */
	public double getMiRadio() {
		return MiRadio;
	}

	/**
	 * @param miRadio
	 *            the miRadio to set
	 */
	public void setMiRadio(double miRadio) {
		MiRadio = miRadio;
	}



	public Component getMiVista() {
		return null;
	}

	public void setMiDireccion(double X, double Y) {
		this.MiDireccion = new Posicion(X, Y);
	}

	@Override
	public void setVivo(boolean b) {
		this.vivo = b;
		
	}

}
